/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package matematicadiscretaxml;

import arbol_prueba.BTree;
import arbol_prueba.BTreeException;
import java.util.ArrayList;
import java.util.Stack;

/**
 *
 * @author diego
 */
public class Where {

    ArrayList lista_lexemas = new ArrayList();
    private ArrayList lista_errores_where = new ArrayList();

    Stack pila_pal_reserv = new Stack();
    Stack pila_identifica = new Stack();
    Stack pila_operadores = new Stack();


    public Where(){}

    public Where(ArrayList _lista_lexemas)
    {
        lista_lexemas = _lista_lexemas;
    }

    public void ingresarPilas()
    {
        boolean bandera_where = false;
        boolean bandera_error = false;
        int indice_where = -1;

        for(int i = 0; i < lista_lexemas.size(); i++)
        {
            if(!bandera_error)
            {
                if( ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("where") )
                {
                    bandera_where = true;
                }
                if(bandera_where == true)
                {
                    switch( ((Lexema)lista_lexemas.get(i)).getTipo_lexema() )
                    {
                        /*
                         * AQUI DEBE HABER UN ELSE YA QUE SOLO DEBEN HABER
                         * IDENTIFICADORES, OPERADORES, CONSTANTES CADENAS
                         *  Y CONSTANTES NUMEROS
                         */
                        case 1:
                            if( ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("where") )
                            {
                                indice_where = i;
                            }
                            else
                            {
                                if( ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("and")
                                    || ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("or")    )
                                {
                                    pila_pal_reserv.push(lista_lexemas.get(i));
                                }
                                else
                                {
                                    bandera_error = true;
                                    lista_errores_where.add(new Error("SENTENCIA SELECCION", "EXISTEN PALABRAS RESERVADAS NO PERMITIDAS EN WHERE"));
                                }
                            }
                            break;
                        case 3:
                            pila_operadores.push(lista_lexemas.get(i));
                            break;
                        case 4:
                            pila_identifica.push(lista_lexemas.get(i));
                            break;
                        case 5:
                            pila_identifica.push(lista_lexemas.get(i));
                            break;
                        case 6:
                            pila_identifica.push(lista_lexemas.get(i));
                            break;
                        default:
                            bandera_error = true;
                            lista_errores_where.add(new Error("SENTENCIA SELECCION", "EXISTEN UN SIMBOLO NO PERMITIDO EN WHERE"));
                            break;
                    }
                }
            }
            
        }
        if(indice_where != -1)
        {
            pila_pal_reserv.push(lista_lexemas.get(indice_where));
        }
    }


    /*
     * FALTA TERMINAR ESTE METODO
     * PERO YA FALTA POCO ;)
     */
    public BTree generarSubArbolWhere(BTree nodo_padre)
    {
        BTree nodo_aux = new BTree(null);
        
        if(nodo_padre.getElement() == "nulo")
        {
            if( ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("where"))
            {
                nodo_aux = new BTree(pila_pal_reserv.pop());
                try
                {
                    /*
                     * AQUI SE DEBE HACER LA PRIMERA LLAMADA RECURSIVA
                     */
                    if(!pila_pal_reserv.empty() )
                    {
                        if(( ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("and")
                           || ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("or") ))
                        {
                            nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_DRCHO);
                            nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_IZDO);
                        }
                        else
                        {
                            lista_errores_where.add(new Error("BLOQUE WHERE", "PALABRA RESERVADA NO PERTENECE A WHERE"));
                        }
                    }
                    else
                    {
                        if(!pila_operadores.empty() )
                        {
                            nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_DRCHO);
                            nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_IZDO);
                        }
                        else
                        {
                            lista_errores_where.add(new Error("BLOQUE WHERE", "DEBE EXISTIR UN OPERADOR O PALABRA RESERVADA DENTRO DE WHERE"));
                        }
                    }
                }
                catch (BTreeException ex)
                {
                    System.out.println(ex.getMessage());
                }
            }
            else
            {
                lista_errores_where.add(new Error("BLOQUE WHERE", "NO COMIENZA CON LA PALABRA WHERE"));
            }
        }
        else
        {
            if( (((Lexema)nodo_padre.getElement()).getLexema()).toLowerCase().equals("where"))
            {
                if(nodo_padre.getDerecha() == null)
                {
                    nodo_aux = new BTree(new Lexema(0, null));
                }
                else
                {
                    if(!pila_operadores.empty() || !pila_pal_reserv.empty())
                    {
                        if(!pila_pal_reserv.empty() && 
                                ( ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("and")
                               || ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("or") ))
                        {
                            nodo_aux = new BTree(pila_pal_reserv.pop());
                            if(!pila_operadores.empty() )
                            {
                                try
                                {
                                    nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_DRCHO);
                                    nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_IZDO);
                                }
                                catch (BTreeException ex)
                                {
                                    System.out.println(ex.getMessage());
                                }    
                            }
                            else
                            {
                                lista_errores_where.add(new Error("BLOQUE WHERE", "DEBE HABER UN OPERADOR "));
                            }
                        }
                        else if(!pila_operadores.empty())
                        {
                            nodo_aux = new BTree(pila_operadores.pop());
                            if(!pila_identifica.empty() )
                            {
                                try
                                {
                                    nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_DRCHO);
                                    nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_IZDO);
                                }
                                catch (BTreeException ex)
                                {
                                    System.out.println(ex.getMessage());
                                }    
                            }
                            else
                            {
                                lista_errores_where.add(new Error("BLOQUE WHERE", "DEBE HABER DOS IDENTIFICADORES "));
                            }
                        }
                        else
                        {
                            lista_errores_where.add(new Error("BLOQUE WHERE", "DEBE HABER UN OPERADOR O UNA PALABRA RESERVADA AND U OR"));
                        } 
                    }
                }
            }
            else
            {
                if( ((Lexema)nodo_padre.getElement()).getTipo_lexema() == 1 &&
                    ( (((Lexema)nodo_padre.getElement()).getLexema()).toLowerCase().equals("and")
                   || (((Lexema)nodo_padre.getElement()).getLexema()).toLowerCase().equals("or") )  )
                {
                    if(nodo_padre.getDerecha() == null)
                    {
                        if(!pila_operadores.empty())
                        {
                            nodo_aux =new BTree(pila_operadores.pop());
                            try
                            {
                                nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_DRCHO);
                                nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_IZDO);
                            }
                            catch (BTreeException ex)
                            {
                                System.out.println(ex.getMessage());
                            } 
                        }
                        else
                        {
                            lista_errores_where.add(new Error("BLOQUE WHERE", "FALTA UN OPERADOR "));
                        }
                    }
                    else
                    {
                        if(pila_pal_reserv.empty())
                        {
                            if(!pila_operadores.empty())
                            {
                                nodo_aux =new BTree(pila_operadores.pop());
                                try
                                {
                                    nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_DRCHO);
                                    nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_IZDO);
                                    
                                }
                                catch (BTreeException ex)
                                {
                                    System.out.println(ex.getMessage());
                                }
                            }
                            else
                            {
                                lista_errores_where.add(new Error("BLOQUE WHERE", "FALTA UN OPERADOR"));
                            }
                        }
                        else 
                        {
                            nodo_aux =new BTree(pila_pal_reserv.pop());
                            if(!pila_operadores.empty())
                            {
                                try
                                {
                                    nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_DRCHO);
                                    nodo_aux.insertar(generarSubArbolWhere(nodo_aux), BTree.LADO_IZDO);
                                }
                                catch (BTreeException ex)
                                {
                                    System.out.println(ex.getMessage());
                                }
                            }
                            else
                            {
                                nodo_aux =new BTree(pila_pal_reserv.pop());
                                lista_errores_where.add(new Error("BLOQUE WHERE", "FALTA UN OPERADOR"));
                            }
                        }
                    }
                }
                else if(((Lexema)nodo_padre.getElement()).getTipo_lexema() == 3 )
                {
                    if(!pila_identifica.empty())
                    {

                        nodo_aux = new BTree(pila_identifica.pop());
                    }
                    else
                    {
                        lista_errores_where.add(new Error("BLOQUE WHERE", "FALTA UN IDENTIFICADOR"));
                    }
                }
                
            }
        }
        return nodo_aux;
    }

    /**
     * @return the lista_errores_where
     */
    public ArrayList getLista_errores_where() {
        return lista_errores_where;
    }

    /**
     * @param lista_errores_where the lista_errores_where to set
     */
    public void setLista_errores_where(ArrayList lista_errores_where) {
        this.lista_errores_where = lista_errores_where;
    }

}
